import dayjs from "dayjs"; // 导入日期js
import { ElMessage, ElMessageBox } from 'element-plus'; // 导入notify通知模块

type Event = {
    target: {
        innerText: string; // 事件对象
    }
}

function number_format(x: number = 0) {
    let tmp_x = x.toString();
    var pattern = /(-?\d+)(\d{3})/;
    while (pattern.test(tmp_x))
        tmp_x = tmp_x.replace(pattern, "$1,$2");
    return tmp_x;
}

export default {
    // 数字千分位格式化
    //
    // x   Number/String 待格式化的数字
    number_format:number_format,
    
    // 获取数字x的绝对值
    //
    //  x   待获取绝对值的数字
    number_abs(x:number = 0){
        if(x < 0){
            return 0 - x
        }
        return x
    },
    
    // 时间转换，将耗时的纳秒转换为可便捷展示的单位
    //
    //  size    消耗的时间【单位为纳秒】
    timesConvert(size:number = 0){
        if (0 == size) return "0 ns";
        var c = 4000, d = 2, e = ["ns", "μs", "ms", "s","e3s","e6s","e9s"],
        f = Math.floor(Math.log(size) / Math.log(c));
        return parseFloat((size / Math.pow(c, f)).toFixed(d)) + " " + e[f];
    },
    
    // 时间转换，将耗时的纳秒转换为可便捷展示的单位
    //
    //  size    消耗的时间
    timesAfter(size:number = 0){
        if (0 == size) return "1 秒";
        if(size < 60 ) return size + " 秒";
        if(size < 3600) return (size / 60).toFixed(2) + " 分钟";
        if(size < 86400) return (size / 3600).toFixed(2) + " 小时";
        if(size < 604800) return (size / 86400).toFixed(2) + " 天";
        if(size < 2592000) return (size / 604800).toFixed(2) + " 周";
        if(size < 31536000) return (size / 2592000).toFixed(2) + " 月";
        return (size / 31536000).toFixed(2) + " 年";
    },

    // 时间戳转时间
    //
    //  inf Number/string 时间戳
    //  ins enum 时间戳类型 0-unix时间戳 1-毫秒级 2-微秒级 3-纳秒级
    timesmarp(inf:number, ins:number = 0){
        if(ins == 1){
            inf = inf / 1000
        } else if (ins == 2) {
            inf = inf / 1000000
        } else if (ins == 3) {
            inf = inf / 1000000000
        }
        return dayjs.unix(inf).format("YYYY-MM-DD HH:mm:ss")
    },

    // 时间转unix时间戳
    //
    //  time 时间字符串，格式：YYYY-MM-DD HH:mm:ss
    time2smarp(time = ''){
        if(time == ""){
            return dayjs().unix()
        }
        return dayjs(time).unix()
    },

    // el-table列中，直接将时间戳转为时间
    // 使用方法为：<el-table-column label="添加时间" prop="created_at" width="165" :formatter="$func.tableTime"/>
    //
    //  row         行对象
    //  column      列对象
    //  cellValue   待转换值
    //  index       待转换下标
    tableTime(row:any, column:any, cellValue:string|any, index:any){
        if (cellValue == null || cellValue == "") return "";
        return dayjs.unix((cellValue)).format("YYYY-MM-DD HH:mm:ss")
    },

    // el-table列中，直接将金额的分转化为格式显示的金额字段
    // 使用方法为：<el-table-column label="变动金额" prop="created_at" :formatter="$func.tableAmount"/>
    //
    //  row         行对象
    //  column      列对象
    //  cellValue   待转换值
    //  index       待转换下标
    tableAmount(row:any, column:any, cellValue:string|any, index:any){
        if (cellValue == null || cellValue == "") return "0 元";
        return number_format( cellValue / 100)+" 元"
    },

    // el-table列中，直接将时间戳转为时间
    // 使用方法为：<el-table-column label="添加时间" width="165" prop="created_at" :formatter="$func.tableDate"/>
    //
    //  row         行对象
    //  column      列对象
    //  cellValue   待转换值
    //  index       待转换下标
    tableDate(row:any, column:any, cellValue:string|any, index:any){
        if (cellValue == null || cellValue == "") return "";
        return dayjs.unix((cellValue)).format("YYYY-MM-DD")
    },

    // 时间格式化展示
    time2time(times:string = ""){
        return dayjs(times).format("YYYY-MM-DD HH:mm:ss")
    },
    
    // 格式化字节大小
    //
    //  size  文件大小，单位：B
    //  num   保留小数  默认2
    formatBytesSize(size:number = 0, num:number = 2){
        if (0 == size) return "0 B";
        var c = 1024, d = num || 2, e = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"],
        f = Math.floor(Math.log(size) / Math.log(c));
        return parseFloat((size / Math.pow(c, f)).toFixed(d)) + " " + e[f];
    },

    // 表格 大小格式化，单位：B
    // 如果返回的数据格式不是B，而是其他单位，请传入对应的参数：label-class-name
    // 如KB格式化：<el-table-column prop="rss" label="内存占用" label-class-name="1024" :formatter="$func.tableSize"/>
    // Byte格式化：<el-table-column prop="rss" label="内存占用" label-class-name="-8" :formatter="$func.tableSize"/>
    // 默认：<el-table-column prop="rss" label="内存占用" :formatter="$func.tableSize"/>
    //
    //  row         行对象
    //  column      列对象
    //  cellValue   待转换值
    //  index       待转换下标
    tableSize(row:any, column:any, cellValue:string|any, index:any){
        if(!cellValue){
            return '-'
        }
        if(column.labelClassName && column.labelClassName > 0){
            cellValue = cellValue * column.labelClassName
        }else if(column.labelClassName && column.labelClassName < 0){
            cellValue = cellValue / ( 0 - column.labelClassName )
        }
        if (0 == cellValue) return "0 B";
        var c = 1024, d = 2, e = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"],
        f = Math.floor(Math.log(cellValue) / Math.log(c));
        return parseFloat((cellValue / Math.pow(c, f)).toFixed(d)) + " " + e[f];
    },

    // 数据复制
    // 此事件为ElTable表格的双击复制事件
    // 使用时在el-table中添加： @cell-dblclick="$func.elTableCopyText"
    //
    //  row：被双击的单元格所在的行的数据对象。
    //  column：被双击的单元格所在的列的定义对象。
    //  cell：被双击的单元格的 DOM 对象。
    //  event：原生的双击事件对象。
    elTableCopyText(row:any, column:any, cell:any, event:Event|string){
        // 双击复制
        let textToCopy = ""
        if(typeof(event) == "string"){
            // 将连续的空行替换成单个空行
            textToCopy = event.replace(/\n+/g,"\n")
        } else {
            textToCopy = event.target.innerText;
        }
        textToCopy = textToCopy.replace(/&nbsp;/g," ")
        textToCopy = textToCopy.replace(/ /g," ")
        if(navigator.clipboard){
            // 安全模式下，允许直接访问剪切板
            navigator.clipboard.writeText(textToCopy)
                .then(() => {
                    ElMessage({ message: '复制成功', type: 'success' }); // 提示
                })
                .catch(error => {
                    ElMessage({ message: '复制失败: '+error, type: 'error' });
                    console.error('复制失败:', error);
                });
        } else {
            // http非安全模式下，使用兼容方案进行复制
            const input = document.createElement('input')
            input.value = textToCopy
            document.body.appendChild(input)
            input.select()
            document.execCommand('copy')
            document.body.removeChild(input)
            ElMessage({ message: '复制成功', type: 'success' }); // 提示
        }
    },

    // 成功提示
    //
    //  msg 提示消息
    success(msg = ""){
        if(msg == ""){
            return
        }
        ElMessage({ message: msg, type: 'success' }); // 提示
    },

    // 失败提示
    //
    //  msg 提示消息
    error(msg = ""){
        if(msg == ""){
            return
        }
        ElMessage({ message: msg, type: 'error' }); // 提示
    },

    // 弹窗输入框
    prompt(message:string = "",value:string|number = "",title:string = "提示"){
        if(value == -1){
            return new Promise((resolve, reject) => {
                ElMessageBox.confirm(message, title, {
                    confirmButtonText: '确认',
                    cancelButtonText: '取消',
                })
                .then(({ value }) => {
                    resolve(value)
                })
                .catch(() => {
                    reject()
                })
            })
        }
        return new Promise((resolve, reject) => {
            ElMessageBox.prompt(message, title, {
                confirmButtonText: '确认',
                cancelButtonText: '取消',
                inputValue: value.toString(),
            })
            .then(({ value }) => {
                resolve(value)
            })
            .catch(() => {
                reject()
            })
        })
    },
    
    // 生成指定长度的随机字符串
    //
    //  length 字符串长度
    generateRandomString(length : number) {
        const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        let result = '';
        for (let i = 0; i < length; i++) {
            const randomIndex = Math.floor(Math.random() * characters.length);
            result += characters[randomIndex];
        }
        return result;
    }    
}